package com.itheima.ydd.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.ydd.common.R;
import com.itheima.ydd.common.ResultData;
import com.itheima.ydd.entity.SysMenu;
import com.itheima.ydd.service.ISysMenuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 菜单表 前端控制器
 * </p>
 *
 * @author author
 * @since 2022-05-22
 */
@RestController
@Slf4j
@RequestMapping("sys_menu")
public class SysMenuController {

   @Autowired
   private ISysMenuService iSysMenuService;

   /**
    * 菜单管理,添加菜单
    *
    * @param sysMenu
    * @return
    */
   //TODO add添加
   @PostMapping("/add")
   public R add(@RequestBody SysMenu sysMenu) {
      log.info("{}", sysMenu);
      //1 判断 前端传输的参数,是否存在
      if (sysMenu == null) {
         //不存在
         return R.error("请检查有误菜单重新提交");
      }
      //存在
      sysMenu.setCreateDate(LocalDateTime.now());
      //2 mp 内置save ,进行保存
      iSysMenuService.save(sysMenu);
      return R.success("添加成功", null);
   }

   // TODO 顶级父菜单展示

   /**
    * 数据回显
    * @param id
    * @return
    */
   @GetMapping("/rowInfo")
   public ResultData getByid(Integer id) {
      log.info("id是_:{}", id);
      //1 条件查询顶级父类,根据id
      LambdaQueryWrapper<SysMenu> ll = new LambdaQueryWrapper<>();
      ll.eq(id != null, SysMenu::getId, id);
      //2 通过service得到 sysmenu对象,并返回前端
      SysMenu sysMenu = iSysMenuService.getOne(ll);
      log.info("sysmen---------------------------------------------:{}", sysMenu);
      ResultData resultData = new ResultData();
      resultData.setErrno(0);
      resultData.setErrmsg("成功");
      resultData.setData(sysMenu);
      return resultData;
   }

   //TODO 展示所有菜单

   /**
    * 展示所有
    *
    * @return
    */

   @GetMapping("allData")
   public ResultData allData() {
      //1 先条件查询所有的顶级父亲菜单,pid 为 0
      LambdaQueryWrapper<SysMenu> ll = new LambdaQueryWrapper<>();
      ll.eq(SysMenu::getPid, 0);
    /*  //2 条件查询 是否再菜单显示 is_hsow 0 不显示
      ll.eq(SysMenu::getIsShow, 1);*/
      //2.1 条件查询，是否是删除标识
      ll.eq(SysMenu::getDelFlag, 0);
      //3 展示顺序
      ll.orderByDesc(SysMenu::getSort)
              .orderByDesc(SysMenu::getUpdateDate)
              .orderByDesc(SysMenu::getCreateDate);

      List<SysMenu> menuslist = iSysMenuService.list(ll);
      for (SysMenu sysMenu : menuslist) {
         log.info("menusli///////////////////////////]/////////):{}",sysMenu);
      }

      for (SysMenu sysMenu : menuslist) {
         //4 查询后会得到集合,便利集合,再递归查询其是否有子菜单, pid = id
         //5.2 递归查询子菜单
         getsubmenu(sysMenu);
      }
      ResultData resultData = new ResultData();
      resultData.setErrno(0);
      resultData.setErrmsg("成功");
      resultData.setData(menuslist);
      return resultData;
   }

   /**
    * 递归的方法
    *
    * @param sysMenu
    * @return
    */
   private SysMenu getsubmenu(SysMenu sysMenu) {// 父菜单
      log.info("////////////////////////////////////{}",sysMenu);
      LambdaQueryWrapper<SysMenu> ll = new LambdaQueryWrapper<>();
      //5.2 传过来的是父亲菜单，当父亲id = pid 及为子，装进 List<sysmenu>
      //select list from table weher pid = ?
      ll.eq(SysMenu::getPid, sysMenu.getId());

    /*  //5.3 条件查询子菜单isshow
      ll.eq(SysMenu::getIsShow, 1);*/
      //5.4条件查询子菜单 del_flag
      ll.eq(SysMenu::getDelFlag, 0);
      //5.5 排序
      ll.orderByDesc(SysMenu::getCreateDate);

      //5.6 得到submenus子菜单
      List<SysMenu> submenuslist = iSysMenuService.list(ll);
      //5.7 将集合放进 sysmenudto的 属性 list
      sysMenu.setChildren(submenuslist);


      //5.6 判断是否有子菜单了
      if(submenuslist==null || submenuslist.size() == 0 ){
         return null ;
      }
      for (SysMenu menu : submenuslist) {
         //5.7 有 继续递归
         getsubmenu(menu);
      }
      //没有 返回
      return sysMenu;
   }
   //TODO 修改(數據回顯已經寫好)

   /**
    * 修改
    * @param sysMenu
    * @return
    */
   @PostMapping("/update")
   public ResultData updateByid(@RequestBody SysMenu sysMenu){
      //1 调用service mp 进行修改
      iSysMenuService.updateById(sysMenu);
      //2 返回
      ResultData resultData = new ResultData();
      resultData.setErrno(0);
      resultData.setErrmsg("");
      resultData.setData("");
      return resultData;
   }
   //TODO 删除

   @GetMapping("/del")
   public ResultData del(Integer id){
      //1 条件查询,删除 id = ?
      LambdaQueryWrapper<SysMenu> ll = new LambdaQueryWrapper<>();
      ll.eq(SysMenu::getId,id);
      //1.1 得到对象sysmenu
      SysMenu sysMenu = iSysMenuService.getOne(ll);
      //2 判断是否为系统默认数据,是的话,不能删除
      if (sysMenu.getDefaultData() != null ){
         return ResultData.error("系统菜单不能删除");
      }
      //3 判断是否有子菜单,有子菜单 不能删除
      LambdaQueryWrapper<SysMenu> ll2 = new LambdaQueryWrapper<>();
      ll2.eq(SysMenu::getPid,id);
      ll2.eq(SysMenu::getDelFlag,0);
      List<SysMenu> list = iSysMenuService.list(ll2);
      if (list.size() != 0){
         return ResultData.error("含有子类菜单不能删除");
      }
      iSysMenuService.removeById(id);
      ResultData resultData = new ResultData();
      resultData.setErrno(0);
      resultData.setErrmsg("");
      resultData.setData("");
      return resultData;
   }


}
